<meta charset="UTF-8"/>
<pre>	
知识点一：认识构造函数原型对象与实例对象的关系

	<script>
		//这个是构造函数
		function F(){
			this.age = 18;
		}
		
		//F.prototype 这个是原型对象
		F.prototype.say = function(){
			
		}
		
		
		//obj是对象，或者叫实例
		var obj = new F();	
		
	</script>


知识点二：系统内置好的关系如下
	1、对象
		对象obj会自动拥有一个属性 __proto__ 。
		obj正是通过这个属性访问原型对象的。
		对象不能直接访问构造函数，但是可以通过原型对象间接访问。
	
	2、原型对象
		原型对象默认内置了属性  __constructor__ 
		通过这个属性可以直接访问他的构造函数
		原型对象里面还默认有能够访问到上级原型的属性。这个一般有系统维护我们可以忽略。

	3、构造函数
		构造函数默认都会内置一个 prototype属性，这个属性默认指向原型对象。
	

	代码解释：
		<script>
			var log = console.log;
			function F(){
				this.age = 18;
			}
			F.prototype.say = function(){
				console.log(this.age);	
			};
			F.prototype.like = "西瓜";
			
			var obj = new F();
			log(obj.like); 				//西瓜
			obj.like =  "冬瓜";
			log(obj.like); 				//冬瓜
			log(obj.__proto__.like); 	//西瓜
			

		</script>
	
	说明：
		第一次访问 obj.like 
			因为对象自己内部没有like属性，会隐式通过__proto__向其原型对象中查找，如果找到了“西瓜”。
		
		第二次访问obj.like
			因为已经手工向对象中添加了属性 like="冬瓜"，这个时候就不在向上一级查找。
			这种叫原型链， 跟之前函数中作用域链是非常类似的。
	
		第三次访问 obj.__proto__.like
			因为 obj.__proto__  等于 F.prototype 所以结果是访问原型中的 “西瓜”

</pre>